home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / pibt40s1.arc / EDITALIN.MOD < prev    next >
Text File  |  1987-08-25  |  7KB  |  193 lines

  1. (*--------------------------------------------------------------------------*)
  2. (*       Edit_A_Line --- Edit line on screen and resend to host             *)
  3. (*--------------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Edit_A_Line;
  6.  
  7. (*--------------------------------------------------------------------------*)
  8. (*                                                                          *)
  9. (*    Function: Edit_A_Line                                                 *)
  10. (*                                                                          *)
  11. (*    Purpose:  Edit line on screen and resend to host                      *)
  12. (*                                                                          *)
  13. (*    Calling Sequence:                                                     *)
  14. (*                                                                          *)
  15. (*       Edit_A_Line;                                                       *)
  16. (*                                                                          *)
  17. (*    Calls:  EditString                                                    *)
  18. (*            Async_Send                                                    *)
  19. (*            Get_Screen_Text_Line                                          *)
  20. (*                                                                          *)
  21. (*--------------------------------------------------------------------------*)
  22.  
  23. VAR
  24.    I           : INTEGER;
  25.    L1          : INTEGER;
  26.    L2          : INTEGER;
  27.    S           : AnyStr;
  28.    S2          : AnyStr;
  29.    S3          : AnyStr;
  30.    Ch          : CHAR;
  31.    X           : INTEGER;
  32.    Y           : INTEGER;
  33.    Saved_Line  : AnyStr;
  34.    Status_Line : INTEGER;
  35.    Old_Status  : INTEGER;
  36.    Saved_X     : BYTE;
  37.    Saved_Y     : BYTE;
  38.    Saved_X_2   : BYTE;
  39.    Saved_Y_2   : BYTE;
  40.    Max_Line    : INTEGER;
  41.    KTop        : INTEGER;
  42.    KBottom     : INTEGER;
  43.  
  44. (*--------------------------------------------------------------------------*)
  45.  
  46. PROCEDURE Set_Up_Status_Line;
  47.  
  48. BEGIN (* Set_Up_Status_Line *)
  49.  
  50.    IF Y <> 1 THEN
  51.       Status_Line := 1
  52.    ELSE
  53.       Status_Line := Max_Line;
  54.  
  55.    IF ( Status_Line <> Old_Status ) THEN
  56.       BEGIN
  57.  
  58.          Saved_X_2 := WhereX;
  59.          Saved_Y_2 := WhereY;
  60.  
  61.          GoToXY( 1 , Old_Status );
  62.          WRITE( TRIM( Saved_Line ) );
  63.          ClrEol;
  64.  
  65.          Old_Status := Status_Line;
  66.  
  67.          Get_Screen_Text_Line( Saved_Line, Status_Line, 1 );
  68.  
  69.          GoToXY( Saved_X_2, Saved_Y_2 );
  70.  
  71.       END;
  72.  
  73. END   (* Set_Up_Status_Line *);
  74.  
  75. (*--------------------------------------------------------------------------*)
  76.  
  77. BEGIN (* Edit_A_Line *)
  78.                                    (* Not available in graphics mode *)
  79.  
  80.    IF ( Current_Video_Mode = HiRes_GraphMode ) THEN EXIT;
  81.  
  82.                                    (* Figure out and remember current *)
  83.                                    (* position                        *)
  84.    X       := 1;
  85.    Y       := WhereY;
  86.  
  87.    Saved_X := WhereX;
  88.    Saved_Y := Y;
  89.                                    (* Figure max line to edit *)
  90.    IF Do_Status_Line THEN
  91.       Max_Line := Max_Screen_Line - 1
  92.    ELSE
  93.       Max_Line := Max_Screen_Line;
  94.  
  95.                                    (* Figure out where status line goes *)
  96.    IF Y <> 1 THEN
  97.       Old_Status := 1
  98.    ELSE
  99.       Old_Status := Max_Line;
  100.                                    (* Get text line to be edited *)
  101.  
  102.    Get_Screen_Text_Line( Saved_Line, Old_Status, 1 );
  103.  
  104.                                    (* No range of lines yet selected. *)
  105.    KTop    := 0;
  106.    KBottom := 0;
  107.                                    (* Begin edit loop. *)
  108.    REPEAT
  109.                                    (* Display status line *)
  110.       Set_Up_Status_Line;
  111.                                    (* Get text of line to be edited *)
  112.  
  113.       Get_Screen_Text_Line( S, Y, 1 );
  114.  
  115.       S  := Trim( S );
  116.       S3 := S;
  117.                                    (* Edit the line *)
  118.  
  119.       X  := MAX( 1 , MIN( X , LENGTH( S ) ) );
  120.       Ch := Edit_String( S, 255, 1, X, Y, Max_Screen_Col, FALSE, Status_Line );
  121.       X  := WhereX;
  122.                                    (* If line changed, send revised text *)
  123.  
  124.       IF ( ( Ch <> CHR( ESC ) ) AND ( Ch <> ^K ) ) THEN
  125.          IF ( S <> S3 ) THEN
  126.             Async_Send_String( Trim( S ) + CHR( CR ) );
  127.  
  128.                                    (* Move to new line if needed *)
  129.       CASE Ch OF
  130.          ^E:  IF ( Y > 1        ) THEN Y := PRED( Y );
  131.          ^X:  IF ( Y < Max_Line ) THEN Y := SUCC( Y );
  132.          ^K:  IF ( KTop = 0 ) THEN
  133.                  KTop := Y
  134.               ELSE
  135.                  BEGIN
  136.  
  137.                     KBottom := Y;
  138.  
  139.                     IF ( KBottom < KTop ) THEN
  140.                        BEGIN
  141.                           I       := KTop;
  142.                           KTop    := KBottom;
  143.                           KBottom := I;
  144.                        END;
  145.  
  146.                     S  := '';
  147.                     Y  := KTop;
  148.  
  149.                     Set_Up_Status_Line;
  150.  
  151.                     FOR I := KTop TO KBottom DO
  152.                        BEGIN
  153.                           Get_Screen_Text_Line( S2, I, 1 );
  154.                           IF ( I = KBottom ) THEN
  155.                              S2 := TRIM( S2 );
  156.                           L1 := ORD( S[0] ) + ORD( S2[0] );
  157.                           IF ( L1 <= 255 ) THEN
  158.                              S := S + S2
  159.                           ELSE
  160.                              S := S + Substr( S2, 1, 255 - ORD( S[0] ) );
  161.                        END;
  162.  
  163.                     S3 := S;
  164.  
  165.                     X  := MAX( 1 , MIN( X , LENGTH( S ) ) );
  166.                     Ch := Edit_String( S, 255, 1, X, Y, Max_Screen_Col,
  167.                                        FALSE, Status_Line );
  168.                     X  := WhereX;
  169.  
  170.                                    (* If line changed, send revised text *)
  171.  
  172.                     IF ( Ch <> CHR( ESC ) ) THEN
  173.                        IF ( S <> S3 ) THEN
  174.                           Async_Send_String( Trim( S ) + CHR( CR ) );
  175.  
  176.                                    (* Reset to no line range selected *)
  177.                     KTop    := 0;
  178.                     KBottom := 0;
  179.  
  180.                  END;
  181.          ELSE ;
  182.       END (* CASE *);
  183.  
  184.    UNTIL ( Ch = CHR( CR ) );
  185.                                    (* Restore previous line *)
  186.    GoToXY( 1 , Status_Line );
  187.    WRITE( TRIM( Saved_Line ) );
  188.    ClrEol;
  189.                                    (* Restore previous position *)
  190.    GoToXY( Saved_X , Saved_Y );
  191.  
  192. END   (* Edit_A_Line *);
  193.